package main

import (
	"fmt"
	"time"
)

/*
自定义错误。实现步骤如下：

	① 定义一个结构体，表示自定义错误的类型；
	② 自定义错误类型实现error接口：Error() string；
	③ 定义一个返回error的函数。根据程序实际功能而定；
*/
func main() {

	area, err := getArea(-1, 3)
	if err != nil {
		fmt.Println(err)
		fmt.Printf(err.Error())
	} else {
		fmt.Println(area)
	}
}

/*
定义结构体，表示自定义错误的类型
*/
type MyError struct {
	when time.Time
	what string
}

/*
定义Error() 方法
*/
func (e MyError) Error() string {

	return fmt.Sprintf("%v : %v", e.when, e.what)
}

/*
定义函数求矩形面积，返回 面积 和 error 对象
*/
func getArea(width, length float64) (float64, error) {

	if width <= 0 || length <= 0 {
		return 0, MyError{
			time.Now(), fmt.Sprintf("长度：%v 或宽度：%v 值错误", width, length)}
	}

	return width * length, nil
}
